package com.mk.transaction;

import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

/**
 * @Author makai
 * @Description: TODO
 * @Date 2024/4/10 17:48
 */
@Slf4j
@Service
public class SignInCmdExe {
    @Resource
    private JdbcTemplate jdbcTemplate;

    /**
     * 执行签到逻辑
     * 这里使用Spring自动事务管理也可以使用手动事务
     */
    @Transactional(rollbackFor = Exception.class)
    public boolean execute(String customerNo, String transactionId) {
        jdbcTemplate.execute("insert into user (id,password,status,user_name) values ('1','1','1','1')");
        // 判断用户今天是否已经签到 已经签到抛出错误信息交由上一步处理
        // status 0：未签到 1：已签到
        int status = 0;
        if (status == 1) {
            log.info("用户已签到，不能重复签到 customerNo={}", customerNo);
            return false;
        }
        // 用户还未签到，记录签到信息，以传入的transactionId作为主键或者单独使用一个字段记录该事务id需要添加唯一索引用于消息回查
        // 记录这个信息是要保证原则性，这里有一个并发问题，可以通过分布式锁或者数据库用户编号加当天日期设置唯一索引，这里不展开说明。
        log.info("用户签到成功 customerNo={} 签到记录transactionId={}", customerNo, transactionId);
        return true;
    }
}
